package de.mnit.schnipsel.swt.baum;

import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;

import de.mnit.basis.daten.struktur.S_Folge;
import de.mnit.basis.daten.struktur.gruppe.Gruppe2;
import de.mnit.basis.daten.struktur.gruppe.Gruppe3;
import de.mnit.basis.daten.struktur.tabelle.S_Tabelle;
import de.mnit.basis.fehler.system.F_Sys_Sicherheit;
import de.mnit.basis.swt.anw.A_MN_Gruppe;
import de.mnit.basis.swt.dialog.SWT_Dialog;
import de.mnit.basis.swt.dialog.SWT_Fehler;
import de.mnit.basis.swt.dnd.transfer.IDObjekt;
import de.mnit.basis.swt.element.S_SWT_Komponente;
import de.mnit.basis.swt.element.feld.baum.SWT_BaumFeld;
import de.mnit.basis.swt.element.steuer.rollbar.gruppe.baum.Ordner;
import de.mnit.basis.swt.spezial.SWTX_Baum;
import de.mnit.basis.sys.Ausgabe;
import de.mnit.basis.sys.event.S_Extern;
import de.mnit.basis.sys.event.S_Zuhoerer;
import de.mnit.basis.sys.sprache.S;
import de.mnit.schnipsel.db.B_Schnipsel;
import de.mnit.schnipsel.db.CRYPTLEVEL;
import de.mnit.schnipsel.db.DBManager;
import de.mnit.schnipsel.zentral.SC_Bilder;
import de.mnit.schnipsel.zentral.SC_GuiObs;

/**
 * @author Michael Nitsche
 * 10.06.2010	Erstellt
 */
public class K_Baum extends A_MN_Gruppe<K_Baum> {

	public static void main(String[] args)   { start(K_Baum.class,400,600); }


	private static final S s=new S(K_Baum.class);
	private static final String E_AUSWAHL="auswahl";
	private static final String E_AKTION="aktion";
	private SWTX_Baum k_baum=new SWTX_Baum();
	private final BaumPopUp	k_popup		= new BaumPopUp(k_baum);
	private BaumHintergrund hintergrund=new BaumHintergrund(k_baum);


	public void neuLaden() {
		iBaumLaden();
	}

	public void sHintergrund(Integer id) { //TODO Nicht setzen, wenn ausgewählt!
		if(id!=null)
			hintergrund.setze(id);
		else
			hintergrund.entfernen();
	}

	public void sAlle() {
		t.k_baum.sAuswahl(BAUMAKTION.ALLE.id);
	}

	public void plus() {
		t.k_baum.plus();
	}

	public void minus() {
		Integer id=t.k_baum.gAuswahlID();
		if(id==null || id<0) {//Negative ID
			SWT_Dialog.hinweis(s.t("Dieser Ordner kann nicht entfernt werden!"));
			return;
		}
		t.k_baum.minusAuswahl();
	}

	public Integer gAuswahlID() {
		return t.k_baum.gAuswahlID();
	}

	public void eAuswahl(S_Zuhoerer<Integer> z) {
		t.zuhoererPlus(E_AUSWAHL, z);
	}

	public void eAktion(S_Zuhoerer<BAUMAKTION> z) {
		t.zuhoererPlus(E_AKTION, z);
	}


	protected S_SWT_Komponente<?, ? extends Composite> layout() {
		return t.k_baum;
	}

	protected void initStyle() {
	}

	protected void initEvents() {
		this.k_popup.init();

		this.k_baum.gBaum().eOeffnen(new Listener() {
			public void handleEvent(Event e) {
				SWT_BaumFeld feld=(SWT_BaumFeld)e.item.getData();
				Integer id=t.k_baum.gBaum().gID(feld);
				iStatus(id, true);
				iBild(feld, id, true);
				Ausgabe.debug();
			}
		});
		this.k_baum.gBaum().eSchliessen(new Listener() {
			public void handleEvent(Event e) {
				SWT_BaumFeld feld=(SWT_BaumFeld)e.item.getData();
				Integer id=t.k_baum.gBaum().gID(feld);
				iStatus(id, false);
				iBild(feld, id, false);
			}
		});

		this.k_baum.sExternPlus(new S_Extern<Integer,Gruppe2<Integer,String>>(){
			public Gruppe2<Integer,String> verarbeite(Integer vaterID) {
				if(vaterID!=null && vaterID<0)
					vaterID=null;
				String titel=SWT_Dialog.frage_Text(f(), s.t("Neuer Ordner:"));
				Ausgabe.debug(vaterID, titel);
				if(titel==null || titel.length()==0)
					return null;
				Ausgabe.debug(vaterID, titel);
				Integer id=DBManager.baum().plus(vaterID, titel);
				Ausgabe.debug(id);
				iBildVater(vaterID, true);
				return Gruppe2.neu(id, titel);
			}
		});
		this.k_baum.sExternMinus(new S_Extern<Integer,Boolean>(){
			public Boolean verarbeite(Integer id) {
				if(id==null || id<0)
					return false;
				DBManager.baum().minus(id);
				return true;
			}
		});
		this.k_baum.sExternVerschieben(new S_Extern<Gruppe3<Integer,Integer,Integer>,Boolean>(){
			public Boolean verarbeite(Gruppe3<Integer,Integer,Integer> id_ziel_index) {
				Integer id=id_ziel_index.g1();
				Integer ziel=id_ziel_index.g2();
				Integer index=id_ziel_index.g3();
				Ausgabe.debug(id, ziel, index);
				if(id==null || id<0 || (ziel!=null && ziel<0) || (ziel==null && index!=null && index==0))
					return false;

				Integer vaterAlt=DBManager.baum().gVater(id);
				iBildVater(vaterAlt, false);

				DBManager.baum().verschieben(id, ziel, index);
				iBildVater(ziel, true);
				return true;
			}
		});
		this.k_baum.sExternStdBild(new S_Extern<Integer,String>(){
			public String verarbeite(Integer o) {
				Ausgabe.debug();
				return SC_Bilder.gIcon_16_Baum_Ordner.pfad;
			}
		});
		this.k_baum.sExternDrop(new S_Extern<Gruppe2<SWT_BaumFeld,IDObjekt[]>,Boolean>(){
			public Boolean verarbeite(Gruppe2<SWT_BaumFeld, IDObjekt[]> g) {
				Ausgabe.debug(g);
				if(g.g1()==null || g.g2()==null)
					return false;
				for(IDObjekt ido : g.g2()) {
					if(!ido.klasse.equals(B_Schnipsel.class))
						continue;
					int zielId=g.g1().schluessel.g();

					boolean geschützt=zielId<0 ? false : DBManager.baum().gGeschuetzt(zielId);
					if(geschützt) {
						try {
							B_Schnipsel bs=DBManager.schnipsel().gEintragB(ido.id);
							if(bs.CRYPT_INHALT.g()==false)
								DBManager.schnipsel().sVerschluesselt(ido.id, CRYPTLEVEL.INHALT);
						}
						catch (F_Sys_Sicherheit e) {
							SWT_Fehler.zeig(e, false);
							return false;
						}
					}
					DBManager.schnipsel().sBaumZweig(ido.id, zielId, zielId==BAUMAKTION.MUELL.id);
				}
				SC_GuiObs.i().liste().aktualisieren();
				return null;
			}
		});
		this.k_baum.sExternEditOk(new S_Extern<Integer,Boolean>(){
			public Boolean verarbeite(Integer id) {
				return id>=0;
			}
		});

		this.k_baum.eVaterUngueltig(new S_Zuhoerer<S_Folge<Ordner>>() {
			public void verarbeite(S_Folge<Ordner> ordner) {
				Ausgabe.debug(ordner);
				for(Ordner o : ordner)
					DBManager.baum().verschieben(o.id, null, Integer.MAX_VALUE);
			}
		});

		this.k_baum.eAuswahl(new S_Zuhoerer<SWT_BaumFeld[]>() {
			public void verarbeite(SWT_BaumFeld[] felder) {
				if(felder.length!=1)
					return;
				Integer id=felder[0].schluessel.g();
				if(id>=0)
					t.zuhoererStart(E_AUSWAHL, id);
				else
					t.zuhoererStart(E_AKTION, BAUMAKTION.gib(id));
			}
		});

		this.k_baum.eUmbenennen(new S_Zuhoerer<Gruppe2<Integer,String>>(){
			public void verarbeite(Gruppe2<Integer, String> g) {
				DBManager.baum().umbenennen(g.g1(), g.g2());
			}
		});
	}

	private void iStatus(Integer id, boolean offen) {
		if(id==null)
			return;
		DBManager.baum().sStatus(id, offen);
	}

	private void iBaumLaden() {
		S_Tabelle<String> tab=DBManager.baum().gTabBaum();
		for(int i=1; i<=tab.gLaenge(); i++) {
			boolean offen 		=Boolean.parseBoolean(tab.gib(5, i));
			boolean geschuetzt	=Boolean.parseBoolean(tab.gib(6, i));
			boolean kinder		=Boolean.parseBoolean(tab.gib(7, i));
			String bild=iBild(offen, geschuetzt, kinder).pfad;
			tab.setze(4, i, bild);
		}

		tab.einfuegen(1, BAUMAKTION.ALLE.id+"",		null,					s.t("Alle"),	SC_Bilder.gIcon_16_Baum_Alle.pfad,  "true", "false", "true");
		tab.einfuegen(2, BAUMAKTION.LOSE.id+"",		BAUMAKTION.ALLE.id+"",	s.t("Lose"),	SC_Bilder.gIcon_16_Baum_Lose.pfad,  "true", "false", "false");
//		tab.einfuegen(3, BAUMAKTION.SUCHE.id+"",	BAUMAKTION.ALLE.id+"",	s.t("Suche"),	SC_Bilder.gIcon_16_Baum_Suche.pfad, "true", "false", "false");
		tab.einfuegen(3, BAUMAKTION.MUELL.id+"",	BAUMAKTION.ALLE.id+"",	s.t("Müll"),	SC_Bilder.gIcon_16_Baum_Muell.pfad, "true", "false", "false");
		t.k_baum.setze(tab);
//		t.k_baum.sOffen(DBManager.baum().gTabOffen());

		t.k_baum.sAuswahl(BAUMAKTION.ALLE.id);
	}

	protected void iBildVater(Integer vaterID, boolean offen) {
		if(vaterID==null || vaterID<0)
			return;
		SWT_BaumFeld feld=t.k_baum.gFeld(vaterID);
		boolean geschuetzt=DBManager.baum().gGeschuetzt(vaterID);
		SC_Bilder bild=iBild(offen, geschuetzt, true);
		feld.sBild(bild);
	}

	private void iBild(SWT_BaumFeld feld, Integer id, boolean offen) {
		if(id==null || id<0) {
			Ausgabe.warnung(feld, id, offen);
			return;
		}
		boolean geschuetzt=DBManager.baum().gGeschuetzt(id);
		SC_Bilder bild=iBild(offen, geschuetzt, feld.gKinderAnzahl()>0);
		Ausgabe.debug(bild.pfad);
		feld.sBild(bild);
	}

	private SC_Bilder iBild(boolean offen, boolean geschuetzt, boolean kinder) {
//		Ausgabe.debugDetail(offen, geschuetzt, kinder);
		if(!kinder)
			offen=false;
		return offen
			? geschuetzt
				? SC_Bilder.gIcon_16_Baum_OrdnerOffenCrypt
				: SC_Bilder.gIcon_16_Baum_OrdnerOffen
			: geschuetzt
				? SC_Bilder.gIcon_16_Baum_OrdnerCrypt
				: SC_Bilder.gIcon_16_Baum_Ordner;
	}

	public void sBild(SWT_BaumFeld feld, boolean geschuetzt) {
		feld.sBild(iBild(feld.swt().getExpanded(), geschuetzt, feld.gKinderAnzahl()>0));
	}
}
